什么情况下需要使用processEvents函数

当我们在同一个线程中同时处理界面以及一些非常耗时的操作时,可能会出现界面无法响应,处于”假死“状态。通常解决这种现象的一种方法就是使用多线程,主线程专门负责界面,另开线程处理耗时的操作。在Qt中还有一种方法就是在耗时操作执行的过程中频繁调用QApplication::processEvents()函数,该函数的作用是让程序处理那些还没有处理的事件,然后再把使用权返回给调用者。

怎么使用processEvents函数

下面举个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
bool MyApp::writeFile(const QString &filename)
{
QFile file(filename);
...
QApplication::setOverrideCursor(Qt::WaitCursor);
QProgressDialog progress;
progress.setWindowTitle(tableData->sNameCH);
progress.setLabelText(QStringLiteral("数据保存中,请稍候..."));
//progress.setCancelButton(0);//不显示“取消”按钮
progress.setCancelButtonText("取消");
progress.setRange(0,rowCount );
progress.setModal(true);
//此处没有调用show()来显示,是因为QProgressDialog会自动决定是否显示
//如果时间过短,就不会显示。
for(int r = 0; r != rowCount; ++r)
{
progress.setValue(row);
//如果用户单击了“取消”,就取消保存文件,并删除该文件。
if(progress.wasCanceled)
{
file.remov();
return false;
}
for(int c = 0; c != colCount; ++c)
{
out << table(r,c);
qApp.processEvents();
}
}
QApplication::restoreOverrideCursor();
}

参考资料

本文参考自文章